#include "protocol.h"

QByteArray Encode(const QJsonObject &jsonObj)
{
    // 将 JSON 对象转为紧凑格式的 JSON 字符串
    QJsonDocument doc(jsonObj);
    QByteArray jsonData = doc.toJson(QJsonDocument::Compact);

    // 构造协议格式数据："len\nmessage\n"
    QByteArray encodedData;
    encodedData.append(QString::number(jsonData.size()).toUtf8());
    encodedData.append('\n');
    encodedData.append(jsonData);
    encodedData.append('\n');
    return encodedData;
}


bool Decode(QByteArray &package, QJsonObject &jsonObj)
{
    // 查找第一个换行符，分隔出长度部分
    int sepIndex = package.indexOf('\n');
    if (sepIndex == -1)
        return false;  // 协议尚不完整

    // 取出长度字符串并转换为整数
    QByteArray lenBytes = package.left(sepIndex);
    bool ok = false;
    int len = lenBytes.toInt(&ok);
    if (!ok || len <= 0)
        return false;  // 长度非法

    // 判断数据是否足够
    int totalLength = sepIndex + 1 + len + 1;  // len + \n + message + \n
    if (package.size() < totalLength)
        return false;  // 数据尚未接收完整

    // 验证结束符是否为 \n
    if (package.at(sepIndex + 1 + len) != '\n')
        return false;

    // 提取 JSON 数据部分
    QByteArray jsonData = package.mid(sepIndex + 1, len);
    QJsonParseError parseError;
    QJsonDocument doc = QJsonDocument::fromJson(jsonData, &parseError);
    if (parseError.error != QJsonParseError::NoError || !doc.isObject())
        return false;

    jsonObj = doc.object();

    // 从原始数据中移除已处理部分
    package.remove(0, totalLength);

    return true;
}
